package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: taoyi
 * @date: 2021/6/15 19:06
 * @version: 1.0
 * @explain:
 */
@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired(required = false)
    private ItemCatMapper itemCatMapper;

    /**
     * 查询数据库所有ItemCat信息
     * @return 将结构存入map返回
     */
    public Map<Integer,List<ItemCat>> getMap(){
        Map<Integer, List<ItemCat>> map = new HashMap<>();
        // 查询数据库所有ItemCat信息
        List<ItemCat> list = itemCatMapper.selectList(null);
        // 循环遍历每一个数据
        for (ItemCat itemCat : list){
            // 判断map中是否有ParentId为kay, 有则把数据直接加入，没有则将该ParentId作为key,数据作为value存入map
            if (map.containsKey(itemCat.getParentId())){
                // 有key,获取该key的List集合后将数据加入
                map.get(itemCat.getParentId()).add(itemCat);
            }else {
                // 没有key
                ArrayList<ItemCat> item = new ArrayList<>();
                item.add(itemCat);
                // 将该ParentId作为key,数据封装在List里作为value存入map
                map.put(itemCat.getParentId(),item);
            }
        }
        return map;
    }


    @Override
    public List<ItemCat> findItemCatList(Integer type) {
        Map<Integer, List<ItemCat>> map = getMap();
        if (type==1) {
            return map.get(0);
        }
        if (type==2) {
            return getLevel2(map);
        }
        return getLevel3(map);
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void deleteItemCat(Integer id, Integer level) {
        if (level == 3){
            // 如果是三级商品分类直接删除
            itemCatMapper.deleteById(id);
        }
        if (level == 2){
            // 需要删除的是二级分类，关联删除三级分类
            // 先删除三级分类
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("parent_id",id);
            itemCatMapper.delete(queryWrapper);
            // 在删除二级分类
            itemCatMapper.deleteById(id);
        }

        if(level==1){
            //1.查询二级分类信息 parent_id=一级ID
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("parent_id",id);
            // 获取主键信息(第一列信息)
            List<Object> twoIdList = itemCatMapper.selectObjs(queryWrapper);
            // 先删除3级
            for(Object twoId : twoIdList){
                QueryWrapper<ItemCat> queryWrapper1 = new QueryWrapper<>();
                queryWrapper1.eq("parent_id",twoId);
                itemCatMapper.delete(queryWrapper1);
                // 在删除2级
                Integer intTwoId = (Integer) twoId;
                itemCatMapper.deleteById(intTwoId);
            }
            // 最后删除一级商品分类
            itemCatMapper.deleteById(id);
        }
    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    private List<ItemCat> getLevel3(Map<Integer, List<ItemCat>> map) {
        // 获取二级分类，二级里面套一级
        List<ItemCat> catList = getLevel2(map);
        for (ItemCat itemCat1 : catList){
            // 获取二级分类
            List<ItemCat> children = itemCat1.getChildren();
            // 根据二级获取三级
            if (children == null) continue;
            for (ItemCat itemCat2 : children){
                List<ItemCat> children2 = map.get(itemCat2.getId());
                itemCat2.setChildren(children2);
            }
        }
        return catList;
    }


    private List<ItemCat> getLevel2(Map<Integer, List<ItemCat>> map) {
        // 获取一级分类
        List<ItemCat> list = getMap().get(0);
        // 循环遍历获取每一个一级分类的二级分类
        for (ItemCat itemCat : list){
            List<ItemCat> catList = getMap().get(itemCat.getId());
            itemCat.setChildren(catList);
        }
        return list;
    }

    /*
    @Override
    public List<ItemCat> findItemCatList(Integer type) {
        List<ItemCat> catList = new ArrayList<>();
        if (type==1) {
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<ItemCat>();
            queryWrapper.eq("parent_id", 0);
            catList = itemCatMapper.selectList(queryWrapper);
        }
        if (type==2) {
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<ItemCat>();
            queryWrapper.eq("parent_id", 0);
            catList = itemCatMapper.selectList(queryWrapper);
            for (ItemCat itemCat : catList){
                queryWrapper.clear();
                queryWrapper.eq("parent_id", 1);
                List<ItemCat> catList2 = new ArrayList<>();
                catList2 = itemCatMapper.selectList(queryWrapper);
                itemCat.setChildren(catList2);
            }
        }
        if (type==3) {
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<ItemCat>();
            queryWrapper.eq("parent_id", 0);
            catList = itemCatMapper.selectList(queryWrapper);
            for (ItemCat itemCat : catList){
                queryWrapper.clear();
                queryWrapper.eq("parent_id", 1);
                List<ItemCat> catList2 = new ArrayList<>();
                catList2 = itemCatMapper.selectList(queryWrapper);
                itemCat.setChildren(catList2);
                for (ItemCat itemCat2 : catList2){
                    queryWrapper.clear();
                    queryWrapper.eq("parent_id", 2);
                    List<ItemCat> catList3 = new ArrayList<>();
                    catList3 = itemCatMapper.selectList(queryWrapper);
                    itemCat2.setChildren(catList3);
                }
            }
        }
        return catList;
    }
    */
}
